home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * LPR.c *
- * *
- * Line Printer Daemon using TCP/IP printer protocol *
- * *
- * -------------- The lpd routines -------------- *
- * *
- * Written by Casper Boon, November, 1992. *
- * *
- * © 1992 Murdoch University. *
- * *
- ************************************************************************/
-
- #include "LPR.H"
- #include "TCPStream.H"
- #include "BackGrounder.h"
- #include "lprProtos.h"
-
-
- static integer SendString(integer crefnum, StringPtr s);
- static integer GetResponse(integer crefnum, Byte which);
- static integer SendFile(integer fRef, StringPtr header, Handle ctl, Boolean text);
- static void clt_add(char *fmt, ...);
-
-
- static integer job_file = 0, cRef = 0;
- static Handle ctlFile = NIL;
- extern integer job_number;
- static char host[256];
- static Byte owner[64];
- static char rbuff[4098];
-
- /************************************************************************
- ************************************************************************/
- integer LPR(StringPtr fname, integer vRef, Boolean text_only)
- {
- Str255 header, jobfName;
- integer fRef, res;
- LongInt file_size;
-
- psprintf(header, "Sending %p", fname);
- LPR_Banner_Mess(header);
-
- if ( FSOpenRO(fname, vRef, &fRef) ) /* error opening file */
- return -1;
-
- GetEOF(fRef, &file_size);
-
- psprintf(jobfName, "df%c%03d%p", 'A' + job_file++, job_number, my_host);
- psprintf(header, "\3%ld %p\012", file_size, jobfName);
-
- if (!text_only)
- clt_add("l%p\012", jobfName);
- else
- clt_add("f%p\012", jobfName);
- clt_add("U%p\012", jobfName);
- clt_add("N%p\012", fname);
-
- res = SendFile(fRef, header, NIL, text_only);
-
- FSClose(fRef);
-
- return res;
- }
-
- /************************************************************************
- ************************************************************************/
- integer SendCtlFile()
- {
- Str255 header;
-
- LPR_Banner_Mess("\pSending control file");
-
- psprintf(header, "\2%ld cfA%03d\012", GetHandleSize(ctlFile), job_number);
- return SendFile(0, header, ctlFile, TRUE);
- }
-
- /************************************************************************
- ************************************************************************/
- static integer SendFile(integer fRef, StringPtr header, Handle ctl, Boolean text)
- {
- LongInt count = 4096, size, done = 0;
- integer state, i;
- char *s;
-
- if ( !SendString(cRef, header) )
- return -1;
-
- if ( !GetResponse(cRef, 0) )
- return -1;
-
- LPR_Banner_Mess("\pSending File");
-
- if (ctl)
- {
- count = GetHandleSize(ctl);
-
- if (count > 0)
- {
- HLock(ctl);
-
- for (i = 0, s = (char*)*ctl; i < count; i++, s++)
- if (*s == '\015') *s = '\012';
-
- if ( TCPSWrite(cRef, *ctl, count, &state) == noErr )
- while (state > 0) { DoIdles(&state); LPR_Banner_Spin(NIL); }
-
- HUnlock(ctl);
-
- if (state < 0) return -1;
- }
- done = count;
- }
- else
- {
- GetEOF(fRef, &size);
- LPR_Banner_PCent(done, size);
-
- while ( !FSRead(fRef, &count, rbuff) || count)
- {
- if (text)
- {
- for (i = 0, s = rbuff; i < count; i++, s++)
- if (*s == '\015') *s = '\012';
- }
- if ( TCPSWrite(cRef, rbuff, count, &state) == noErr )
- while (state > 0) DoIdles(&state);
-
- if (state < 0) return -1;
-
- done += count;
- LPR_Banner_PCent(done, size);
-
- count = 4096;
- }
- }
-
- if ( TCPSWrite(cRef, "\0\0", 1, &state) == noErr )
- while (state > 0) DoIdles(&state);
-
- if ( !GetResponse(cRef, 0) ) return -1;
-
- return 0;
- }
-
- /********************************************************************
- * Sends a string to the remote host. *
- ********************************************************************/
- static integer SendString(integer cRef, StringPtr s)
- {
- Word slen;
- integer state;
-
- if ( !(slen = *s++) ) return 1;
-
- if ( TCPSWrite(cRef, (Ptr)s, slen, &state) == noErr )
- while (state > 0) { DoIdles(&state); LPR_Banner_Spin("\p"); }
- else
- return 0;
-
- if (state < 0)
- return 0; /* write failed */
-
- return 1;
- }
-
- /********************************************************************/
- /* Get a response from the remote host. */
- /********************************************************************/
- static integer GetResponse(integer cRef, Byte which)
- {
- integer state, size, eof;
- Byte buff[256], *s=buff;
-
- size = 256;
-
- if ( TCPSRead(cRef, (Ptr)buff, &size, &eof, &state) == noErr )
- while (state > 0) { DoIdles(&state); LPR_Banner_Spin("\p"); }
-
- if (state < 0)
- return 0; /* read failed */
-
- if (buff[0] != which)
- {
- if (size > 1)
- {
- buff[0] = size - 1;
- ParamText(buff, (StringPtr)"", (StringPtr)"", (StringPtr)"");
- Alert(256, NIL);
- }
- return 0;
- }
-
- return 1;
- }
-
-
- /************************************************************************
- ************************************************************************/
- integer StartJob(StringPtr fname)
- {
- integer state = 0;
- Str255 buffer;
-
- ctlFile = NewHandle(0);
-
- if (InitTCPS())
- AlertUser(eInitTCP);
-
- BlockMove(my_user, owner, my_user[0]+1);
- sprintf(host, "%p", prt_server);
-
- clt_add("H%p\012", my_host);
- clt_add("P%p\012", owner);
- clt_add("J%p\012", fname);
- clt_add("C%p\012", my_host);
- clt_add("L%p\012", owner);
-
- psprintf(buffer, "Connecting to %p", prt_server);
- LPR_Banner_Up();
- LPR_Banner_Spin(buffer);
-
- if ( TCPSOpen(&cRef, host, 721, LPD_PORT, FALSE, &state) != noErr )
- return -1; /* it failed */
-
- while (state > 0) { DoIdles(&state); LPR_Banner_Spin(NIL); }
-
- if (state < 0)
- {
- if ( TCPSClose(cRef, &state) == noErr )
- while (state > 0) DoIdles(&state);
- return -1; /* couldn't open */
- }
-
- psprintf(buffer, "\2%p\012", prt_name);
- if ( !SendString(cRef, buffer) ) /* start job */
- return -1; /* failed ! */
-
- if ( !GetResponse(cRef, 0) )
- return -1;
-
- return 0;
- }
-
- /************************************************************************
- ************************************************************************/
- integer EndJob()
- {
- integer state = 0;
-
- if ( TCPSClose(cRef, &state) == noErr )
- while (state > 0) DoIdles(&state);
-
- ExitTCPS();
- }
-
-
- #include <stdarg.h>
- integer strlen(char*);
-
- /************************************************************************
- ************************************************************************/
- static void clt_add(char *fmt, ...)
- {
- char buff[256];
- LongInt len = GetHandleSize(ctlFile), slen;
- va_list arglist;
-
- va_start(arglist, fmt);
- vsprintf(buff, fmt, arglist);
- va_end(arglist);
-
- slen = strlen(buff);
-
- SetHandleSize(ctlFile, len+slen);
- HLock(ctlFile);
- BlockMove(buff, &(*ctlFile)[len], slen);
- HUnlock(ctlFile);
- }
-